Amazon Bedrock AgentでSlackからRAGを利用できる環境を構築する

Amazon Bedrock AgentでSlackからRAGを利用できる環境を構築する

Clock Icon2024.11.28

先日、Amazon Bedrock Knowledge BasesとPineconeを使用したRAG(Retrieval-Augmented Generation)を構築しました。
https://dev.classmethod.jp/articles/bedrock-kb-rag-pinecone-lowcost/

今回はAmazon Bedrock AgentとAWS Chatbotを構築し、Slack上からRAGにアクセスできるようにします。
前回同様に可能な限りCloudFormationでの実装を行います。

構成

今回作成するリソースは以下のとおりです。

rag-chatbot-stack

構築のソースコードは下記Githubにアップロードしているので、必要に応じてご参照ください。
https://github.com/sakai-classmethod/bedrock-agent-kb-slack

ここからはソースコードを一部抜粋しながら解説します。

Chatbot

template.yaml
  SlackChannel:
    Type: AWS::Chatbot::SlackChannelConfiguration
    Properties:
      ConfigurationName: !Sub ${AWS::StackName}-slack-channel
      SlackChannelId: !Ref SlackChannelId
      IamRoleArn: !GetAtt ChatbotRole.Arn
      SlackWorkspaceId: !Ref SlackWorkspaceId
      LoggingLevel: INFO

チャットクライアントとして設定されているSlackのワークスペースにチャネル設定を追加します。

IAM

template.yaml
  ChatbotRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${AWS::StackName}-chatbot-role
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: chatbot.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - !Ref ChatbotPolicy

  ChatbotPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      ManagedPolicyName: !Sub ${AWS::StackName}-chatbot-policy
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - bedrock:InvokeAgent
            Resource: !GetAtt AgentAlias.AgentAliasArn

  AgentRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub AmazonBedrockExecutionRoleForAgents_${AWS::StackName}
      ManagedPolicyArns:
        - !Ref AgentPolicy
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: bedrock.amazonaws.com
            Action: sts:AssumeRole
            Condition:
              StringEquals:
                aws:SourceAccount: !Ref AWS::AccountId
              ArnLike:
                aws:SourceArn: !Sub arn:aws:bedrock:${AWS::Region}:${AWS::AccountId}:agent/*

  AgentPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - bedrock:InvokeModel
            Resource:
              - !Sub arn:aws:bedrock:${AWS::Region}::foundation-model/${FoundationModelId}
          - Effect: Allow
            Action:
              - bedrock:Retrieve
            Resource:
              - !Sub arn:aws:bedrock:${AWS::Region}:${AWS::AccountId}:knowledge-base/${KnowledgeBaseId}

AWS ChatbotとAmazon Bedrock Agentの連携に必要なIAMロールとポリシーを設定します。
Knowledge BaseへのアクセスはKnowledgeBaseIdを指定して最小単位に絞っています。

Bedrock Agent

template.yaml
  Agent:
    Type: AWS::Bedrock::Agent
    Properties:
      AgentName: !Sub ${AWS::StackName}-agent
      AgentResourceRoleArn: !GetAtt AgentRole.Arn
      FoundationModel: !Ref FoundationModelId
      Instruction: |
        あなたは専門的な情報を提供するAIアシスタントです。以下の指示に厳密に従って回答を生成してください:
        1. 提供されたナレッジベースの情報を優先的に使用し、それらを完全に理解してください。
        2. ナレッジベースの情報のみを使用して回答を作成してください。ナレッジベースに含まれていない情報は絶対に使用しないでください。
        3. 回答の中で、参照した情報の出典や根拠を明確に示してください。可能な限り、具体的な情報源や文書名を言及してください。
        4. ナレッジベースに関連情報がない場合は、「回答に必要な情報が見つかりませんでした。」とのみ回答してください。
        5. 質問が具体的でない場合は、より具体的な質問の仕方をアドバイスしてください。
        6. 回答は平文のテキストで提供し、見出しやタイトルは不要です。JSON形式での回答は避けてください。
        7. 雑談や挨拶には応じず、「私は雑談はできません。通常のチャット機能をご利用ください。」とのみ回答してください。
        8. 指示されたルール以外のことは絶対に行わないでください。例外は一切ありません。
        これらの指示に従い、ユーザーの質問に対して正確かつ関連性の高い情報を提供してください。常に情報の出典を明らかにし、透明性のある回答を心がけてください。
      KnowledgeBases:
        - KnowledgeBaseId: !Ref KnowledgeBaseId
          Description: Knowledge Base for the Agent.
          KnowledgeBaseState: ENABLED
      AutoPrepare: true

  AgentAlias:
    Type: AWS::Bedrock::AgentAlias
    Properties:
      AgentAliasName: !Sub ${AWS::StackName}-agent-alias-v1
      AgentId: !Ref Agent

Amazon Bedrock AgentとそのAliasを作成します。
Instructionで、エージェントに何を実行するか、ユーザーとどのように対話するかを指示しています。

構築

ここからは実際に構築を行います。
前提として以下の準備が必要なので、適宜実施してください。

事前準備が完了したらAWSコンソールでAWS Chatbotのクライアント設定を行います。
FireShot Capture 044 - AWS Chatbot - Global - us-east-2.console.aws.amazon.com

AWS Chatbot _ ____________ Slack ___________________________ _ ____________ Slac

CloudFormation実行時にワークスペース IDが必要になるので手元に控えておきます。

WorkSpaceId-2024-11-28

Agentと接続するSlackのチャンネルIDも手元に控えておきます。

SlackId-2024-11-28-152609

GitHubからリポジトリをクローンし、ディレクトリを移動します。

$ git clone https://github.com/sakai-classmethod/bedrock-agent-kb-slack.git
$ cd bedrock-agent-kb-slack

CloudFormationをデプロイします。(コンソールやAWS CLIからのデプロイでも可)
KnowledgeBaseが作成されているリージョンと同じオレゴンリージョンを指定します。

rain deploy -r us-west-2 template.yaml rag-chatbot-stack 
Enter a value for parameter 'SlackChannelId' "The ID of the Slack channel.": <SlackのチャネルID>
Enter a value for parameter 'SlackWorkspaceId' "The ID of the Slack workspace.": <AWS ChatbotのワークスペースID>
Enter a value for parameter 'KnowledgeBaseId' "The ID of the Knowledge Base.": <Knowledge BaseのID>
Enter a value for parameter 'FoundationModelId' (default value: anthropic.claude-3-5-sonnet-20240620-v1:0): <変更がなければそのままEnter>
CloudFormation will make the following changes:
Stack rag-chatbot-stack:
  + AWS::Bedrock::AgentAlias AgentAlias
  + AWS::IAM::ManagedPolicy AgentPolicy
  + AWS::IAM::Role AgentRole
  + AWS::Bedrock::Agent Agent
  + AWS::IAM::ManagedPolicy ChatbotPolicy
  + AWS::IAM::Role ChatbotRole
  + AWS::Chatbot::SlackChannelConfiguration SlackChannel
Do you wish to continue? (Y/n) 
Deploying template 'template.yaml' as stack 'rag-chatbot-stack' in us-west-2.
Stack rag-chatbot-stack: CREATE_COMPLETE
  Outputs:
    AgentAlias: xxxxxxxxxx
    AgentArn: arn:aws:bedrock:aws-region:111122223333:agent/xxxxxxxxxx
Successfully deployed rag-chatbot-stack

AWSリソースのデプロイが完了したら、Slackのチャンネルで以下のメッセージを送信します。
AgentAliasAgentArnはCloudFormationのOutputsから取得してください。(コンソールでも確認可)

@aws connector add <任意のコネクタ名> <AgentArn> <AliasID>

Capture-2024-11-28-140821

無事接続ができたのでChatbotからスレッド内返信が来ました。

動作確認

ナレッジベースに同期済みの内容を質問してみます。

Capture-2024-11-28-140840

続けて、データソースに追加されていないことについても確認してみます。

Capture-2024-11-28-140855

問題なく動作することが確認できました。

まとめ

今回はAmazon Bedrock AgentとAWS Chatbotを使用して、Amazon Bedrock Knowledge Basesと接続してみました。
本来必要となるアプリの実装が省略でき、手軽にRAGを利用することができます。
どなたかの参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.